159. RBAC基本分析

前言

RBAC這東西很久前就知道了,但一直沒實際去驗證過。
最近看istio ambient,看到他用L4的方式管理SA角色誰可以呼叫誰,
才又跑去認真看了一次。

正文

一個標準的Role通常長得像這樣

apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  namespace: default
  name: pod-reader
rules:
- apiGroups: [""] # "" 標明 core API 組
  resources: ["volumesnapshots"]
  verbs: ["get", "watch", "list"]

rules 分成下面三個部分

如果要最高權限的話就是用 * 代替,
但切記勿亂用。

apiGroups

apiGroups每個資源名稱所代表的apiGroups都不一樣。
執行 kubectl api-resources

159-fig.2.png

觀察APIVERSION的欄位,
bindings的APIVERSION 是 v1 的話代表是核心,所以 apiGroups: [""]
allowlistedworkloads的APIVERSION是auto.gke.io/v1,所以apiGroups: ["auto.gke.io"]

p.s namespace代表這個resource是不是全域資源,需不需要指定namespace來使用

resources

上面有提到每個resource有指定的APIGroups,
這邊就比較簡單,只要將上面指令查到的NAME拿來用就好。
注意,不是後面的kind。

verb

查詢所有的resouce

kubectl api-resources --sort-by name -o wide

在你要選擇的資源內,用[ ] 包起來的表示為此resouce的可以接受哪些動作。
159-fig.0.jpg

在K8s裏面透過RBAC管理這個角色可以對這個resouce做什麼,
對照表,參考

動作 verb 說明
讀取 get 取得單一資源的詳細資訊
讀取 list 列出資源清單
讀取 watch 持續監聽資源變化
寫入 create 創建新資源
修改 update 修改現有資源
修改 patch 局部修改 (使用 kubectl patch)
刪除 delete 刪除資源
刪除 deletecollection 批量刪除資源

put 與 patch的差別在於,如果只有單一個資料要更新的話,使用patch ,所有資料都要更新的話用put

ref.

統整

設定的流程,會先指定role 可以對哪些資源做些什麼操作。
然後使用rolebinding,來指定這個role與user/group

159-fig.1.png

設定完使用者後,要綁到deploy上面 ,
要在template.spec底下寫 serviceAccountName

template:
  metadata:
    labels:
      app: filebeat
  spec:
    serviceAccountName: filebeat

pod有使用這個sa的話,那token會在下面的這個位置

/var/run/secrets/kubernetes.io/serviceaccount/token

ref.